/*
 * Created on 15.03.2006
 *
 */
package org.jdesktop.swingx.sort;

import java.util.List;

import javax.swing.RowSorter;
import javax.swing.SortOrder;

/**
 * Collection of convenience methods.
 */
public class SortUtils {

	// ---------------------- static utility methods

	/**
	 * Returns the first SortKey in the list which is sorted. If none is sorted,
	 * null is returned.
	 * 
	 * @param keys
	 *            a list of SortKeys to search
	 * @return the first SortKey which is sorted or null, if no is found.
	 */
	public static RowSorter.SortKey getFirstSortingKey(List<? extends RowSorter.SortKey> keys) {
		for (RowSorter.SortKey key : keys) {
			if (isSorted(key.getSortOrder())) {
				return key;
			}
		}
		return null;
	}

	/**
	 * Returns the first SortKey in the list for the given column, or null if
	 * the column has no SortKey.
	 * 
	 * @param keys
	 *            a list of SortKeys to search
	 * @param modelColumn
	 *            the column index in model coordinates
	 * @return the first SortKey for the given column or null if none is found.
	 */
	public static RowSorter.SortKey getFirstSortKeyForColumn(List<? extends RowSorter.SortKey> keys, int modelColumn) {
		for (RowSorter.SortKey key : keys) {
			if (key.getColumn() == modelColumn) {
				return key;
			}
		}
		return null;
	}

	/**
	 * Removes and returns the first SortKey in the list for the given column,
	 * or null if the column has no SortKey.
	 * 
	 * @param keys
	 *            a list of SortKeys to search
	 * @param modelColumn
	 *            the column index in model coordinates
	 * @return the first SortKey for the given column or null if none is found.
	 */
	public static RowSorter.SortKey removeFirstSortKeyForColumn(List<? extends RowSorter.SortKey> keys, int modelColumn) {
		for (RowSorter.SortKey key : keys) {
			if (key.getColumn() == modelColumn) {
				keys.remove(key);
				return key;
			}
		}
		return null;
	}

	public static boolean isSorted(SortOrder sortOrder) {
		return sortOrder != null && (SortOrder.UNSORTED != sortOrder);
	}

	/**
	 * Convenience to check for ascending sort order. PENDING: is this helpful
	 * at all?
	 * 
	 * @return true if ascendingly sorted, false for unsorted/descending.
	 */
	public static boolean isAscending(SortOrder sortOrder) {
		return sortOrder == SortOrder.ASCENDING;
	}

	public static boolean isSorted(SortOrder sortOrder, boolean ascending) {
		return isSorted(sortOrder) && (ascending == isAscending(sortOrder));
	}

	private SortUtils() {
	};
}
